﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;

namespace POC.Controls
{
    public class DesignerCanvas : Canvas
    {
        private Point? rubberbandSelectionStartPoint = null;

        protected override void OnMouseDown(MouseButtonEventArgs e)
        {
            base.OnMouseDown(e);
            if (e.Source == this)
            {
                this.Children.OfType<ISelectable>().ToList().ForEach(p => p.IsSelected = false);
                this.rubberbandSelectionStartPoint = new Point?(e.GetPosition(this));

                Focus();
                e.Handled = true;
            }
        }

        protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);

            // if mouse button is not pressed we have no drag operation, ...
            if (e.LeftButton != MouseButtonState.Pressed)
                this.rubberbandSelectionStartPoint = null;

            // ... but if mouse button is pressed and start
            // point value is set we do have one
            if (this.rubberbandSelectionStartPoint.HasValue)
            {
                // create rubberband adorner
                AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(this);
                if (adornerLayer != null)
                {
                    RubberbandAdorner adorner = new RubberbandAdorner(this, rubberbandSelectionStartPoint);
                    if (adorner != null)
                    {
                        adornerLayer.Add(adorner);
                    }
                }
            }
            e.Handled = true;
        }

        protected override Size MeasureOverride(Size constraint)
        {
            Size size = new Size();

            foreach (UIElement element in this.InternalChildren)
            {
                double left = Canvas.GetLeft(element);
                double top = Canvas.GetTop(element);
                left = double.IsNaN(left) ? 0 : left;
                top = double.IsNaN(top) ? 0 : top;

                //measure desired size for each child
                element.Measure(constraint);

                Size desiredSize = element.DesiredSize;
                if (!double.IsNaN(desiredSize.Width) && !double.IsNaN(desiredSize.Height))
                {
                    size.Width = Math.Max(size.Width, left + desiredSize.Width);
                    size.Height = Math.Max(size.Height, top + desiredSize.Height);
                }
            }

            Console.WriteLine("Width:"+size.Width+ ";Height:" + size.Height + "");
            return size;
        }

        //protected override void OnDrop(DragEventArgs e)
        //{
        //    base.OnDrop(e);

        //    DragObject dragObject = e.Data.GetData(typeof(DragObject)) as DragObject;
        //    if (dragObject == null || String.IsNullOrEmpty(dragObject.Xaml))
        //    {
        //        return;
        //    }

        //    if ((this.CanvasType == (int)GraphType.testseq && dragObject.CmdType != ElemType.item && dragObject.CmdType != ElemType.and_cmd
        //        && dragObject.CmdType != ElemType.or_cmd && dragObject.CmdType != ElemType.decision_cmd && dragObject.CmdType != ElemType.complicating_cmd)
        //        || (this.CanvasType == (int)GraphType.testitem && dragObject.CmdType == ElemType.item))
        //    {
        //        return;
        //    }

        //    DesignerItem newItem = this.CreateDesignerItem(dragObject);

        //    Point position = e.GetPosition(this);
        //    if (dragObject.DesiredSize.HasValue)
        //    {
        //        Size desiredSize = dragObject.DesiredSize.Value;
        //        newItem.Width = desiredSize.Width;
        //        newItem.Height = desiredSize.Height;

        //        DesignerCanvas.SetLeft(newItem, Math.Max(0, position.X - newItem.Width / 2));
        //        DesignerCanvas.SetTop(newItem, Math.Max(0, position.Y - newItem.Height / 2));
        //    }
        //    else
        //    {
        //        DesignerCanvas.SetLeft(newItem, Math.Max(0, position.X));
        //        DesignerCanvas.SetTop(newItem, Math.Max(0, position.Y));
        //    }

        //    Canvas.SetZIndex(newItem, this.Children.Count);
        //    this.Children.Add(newItem);
        //    SetConnectorDecoratorTemplate(newItem);

        //    //update selection
        //    this.SelectionService.SelectItem(newItem);
        //    newItem.Focus();

        //    e.Handled = true;
        //}
    }
}
